#pragma once

#include "../common/type.h"

typedef enum ProcessState {
    PROCESS_STATE_RUNNABLE, //就绪态
    PROCESS_STATE_RUNNING, //运行态
    PROCESS_STATE_BLOCKED, //阻塞态 
    PROCESS_STATE_ZOMBIE //僵尸态
} ProcessState;

typedef enum ProcessType {
    PROCESS_TYPE_USER,
    PROCESS_TYPE_KERNEL,
} ProcessType;

typedef struct  PCB {
    PhysicalAddress* KernelStackPointer;//内核栈栈顶指针
    PID ID;//进程号
    PID ParentID;
    ProcessState Status;//进程当前状态
    ProcessType Type;//进程类型  
    u32 RootPPN;
    i32 ExitCode;
} PCB;

// PID allocator
#define MAX_PROCESS_COUNT 1024
typedef struct PIDALLocator {
    u32 Bitmap[MAX_PROCESS_COUNT / 32]; //为什么是除以32
} PIDALLocator;

typedef struct ProcessManager {
    PCB* Current;
    PCB* RunnableProcesses[MAX_PROCESS_COUNT];
    u32 Front;
    u32 Rear;
    PCB* ZombieProcesses[MAX_PROCESS_COUNT];
} ProcessManager;

// Process Need

#define PageSize 4096

// Context
typedef struct SwitchContext {
    u32 EDI;
    u32 ESI;
    u32 EBX;
    u32 EBP;
    u32 EIP;
} SwitchContext;//进程切换上下文

//这里要问一下
typedef struct  InterruptContext {
    u32 Vector;  //中断向量号
    u32 EDI;//目标变址寄存器 
    u32 ESI;//源变址寄存器 
    u32 EBP;//栈基址指针
    u32 ESP;//栈顶指针
    u32 EBX;//基址寄存器
    u32 EDX;//数据寄存器
    u32 ECX;//计数寄存器
    u32 EAX;//累加寄存器
    u32 GS;//特定系统数据结构
    u32 FS;//灵活用途段
    u32 ES;//附加数字段
    u32 DS;//默认数字段
    u32 ErrCode;//错误码，默认0x88888888
    u32 EIP;//程序计数器
    u32 CS;
    u32 PSW;//程序状态字
    u32 ESP3;//用户态栈
    u32 SS3;//用户态栈段选择子
} InterruptContext;

#define USerStackTop 0x10000000


